<?php  if ( ! defined('IN_DiliCMS')) exit('No direct script access allowed');

class Settings {
	
    /**
     * CI 的引用
     * 
     * @var object 
     */
	var $_ci = NULL;
    
    /**
     * 设置项
     * 
     * @var array 
     */
	var $setting = array();
    
    /**
     * 加载过的类
     * 
     * @var array 
     */
	var $is_loaded = array();
    
    /**
     * 可用的设置路径
     * 
     * @var array 
     */
	var $_setting_paths = array(BASEPATH);
	
    /**
     * 构造函数
     */
	function __construct() {
		$this->_ci = &get_instance(); //获取实例
		$this->load('site'); //加载站点信息
	}
	
    /**
     * 加载配置文件
     * 
     * @param string $file 文件名称,默认是 site(站点信息)
     * @param bool $use_sections 是否使用选项，这个是做什么用的？合并？
     * @param bool $fail_gracefully 优雅处理失败？
     * @return bool 加载是否成功 
     */
	function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) {
		$file = ($file == '') ? 'site' : str_replace(EXT, '', $file); //如果是文件名的话，去掉扩展名
		$loaded = FALSE;

		foreach($this->_setting_paths as $path) {
			$file_path = $path.'../settings/'.$file.EXT; //生成文件名

			if (in_array($file_path, $this->is_loaded, TRUE)) { //如果是已加载项，则跳过继续下一个
				$loaded = TRUE;
				continue;
			}

			if ( ! $this->_ci->platform->cache_exists($path.'../settings/'.$file.EXT)) { //如果缓存文件存在，则跳过继续下一个
				continue;
			}
            
			@eval('?>'.$this->_ci->platform->cache_read($file_path)); //@有开销代价，读取缓存，并执行
			if ( ! isset($setting) OR ! is_array($setting)) { //
				if ($fail_gracefully === TRUE) {
					return FALSE; //如果是 graceful(优雅) 的处理错误方式，则直接返回 FALSE
				}
				show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); //否则显示错误信息
			}

			if ($use_sections === TRUE) { //如果有选项，这个地方不太明白是什么意思
				if (isset($this->setting[$file])) { //如果已设置
					$this->setting[$file] = array_merge($this->setting[$file], $setting); //则合并
				}
				else {
					$this->setting[$file] = $setting;
				}
			}
			else {
				$this->setting = array_merge_recursive($this->setting, $setting); //如果有重复键则递归合并成新数组？
			}

			$this->is_loaded[] = $file_path;
			unset($setting);

			$loaded = TRUE;
		}

		if ($loaded === FALSE) {
			if ($fail_gracefully === TRUE) { //又见优雅失败
				return FALSE;
			}
			show_error('The configuration file '.$file.EXT.' does not exist.');
		}
        
		return TRUE;
	}

    /**
     * 获取某一配置项的信息
     * 
     * @param string $item 配置项名称
     * @param string $index 配置项索引
     * @return string 值
     */
	function item($item, $index = '') {
		if ($index == '') {
			if ( ! isset($this->setting[$item])) {
				return FALSE;
			}

			$pref = $this->setting[$item];
		}
		else {
			if ( ! isset($this->setting[$index])) {
				return FALSE;
			}

			if ( ! isset($this->setting[$index][$item])) {
				return FALSE;
			}

			$pref = $this->setting[$index][$item];
		}

		return $pref;
	}

    /**
     * 设置配置项
     * 
     * @param string $item 项名
     * @param string/array $value 值
     */
	function set_item($item, $value) {
		$this->setting[$item] = $value;
	}
	
}
/**
 * setting 类的 helper
 * 这个应该单独设置一个helper 的
 * 
 * @param string $key
 * @return string/array 
 */
function setting($key) {
	$ci = &get_instance();
	return 	$ci->settings->item($key); //返回配置项相应的项
}

/**
 * 更新缓存
 * 
 * @param array $array
 * @param string $fix 参数
 */
function update_cache($array , $fix = '') {
	$ci = &get_instance();
	$ci->load->model('dili/cache_mdl'); //加载缓存类
	$array = is_array($array) ? $array : array($array);
	foreach($array as $v) {
		$method = 'update_'.$v.'_cache';
		$ci->cache_mdl->$method($fix);
	}
}
